"""

给定一个长度为 n 的整数数组height。有n条垂线，第 i 条线的两个端点是(i, 0)和(i, height[i])。
找出其中的两条线，使得它们与x轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。

You are given an integer array height of length n.
There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]).
Find two lines that together with the x-axis form a container,such that the container contains the most water.
Return the maximum amount of water a container can store.
"""

class Solution(object):
    def maxArea(height):
        """
        :type height: List[int]
        :rtype: int
        一般方法就是两个for循环，每次都进行计算找到最大值
        双指针方法：
            初始在列表两侧设置两个指针，每次计算完当前的容量后比较两侧的容器高低，
            根据博弈论，每次要去改变自己的短板，虽然可能变得更差，但是总比不动（或者改变自己的长板而减小）强，
            动最差的部分可能找到更好的结果，但是动另一边总会更差或者不变
            因此每次移动两侧容量小的指针，直到两个指针相遇
        """
        left, right = 0, len(height)-1
        maxCap = 0
        while left != right:
            """
            第33行可以换成下面的，因为调用max和min的原因，执行速度会很慢，leetcode上一个180ms一个100ms
            curCap = (right-left)* (height[left] if height[left]<height[right] else height[right])
            maxCap = maxCap if maxCap>curCap else curCap
            """
            maxCap = max([maxCap, (right-left)*min([height[left], height[right]])])
            if height[left]<height[right]:
                left += 1
            else:
                right -= 1
        return maxCap
print(Solution.maxArea([2,3,4,5,18,17,6]))